<?php
/**
 * @author zyb
 * @todo 后台控制器基类
 * @deprecated  2015-4-11
 */
class backendAction extends baseAction
{
    protected $_name = '';
    protected $menuid = 0;
    protected $get_img_path='';
    public function _initialize() {
        parent::_initialize();
        $this->_name = $this->getActionName();
        $this->_model_name=MODULE_NAME;
        $this->assign('action_name',ACTION_NAME);
        $this->assign('_action_name',ACTION_NAME);
        $this->check_priv();
        $this->menuid = $this->_request('menuid', 'trim', 0);
        if ($this->menuid) {
            $sub_menu = D('menu')->sub_menu($this->menuid, $this->big_menu);
            $selected = '';
            foreach ($sub_menu as $key=>$val) {
                $sub_menu[$key]['class'] = '';
                if (MODULE_NAME == $val['module_name'] && ACTION_NAME == $val['action_name'] && strpos(__SELF__, $val['data'])) {
                    $sub_menu[$key]['class'] = $selected = 'on';
                }
            }
            if (empty($selected)) {
                foreach ($sub_menu as $key=>$val) {
                    if (MODULE_NAME == $val['module_name'] && ACTION_NAME == $val['action_name']) {
                        $sub_menu[$key]['class'] = 'on';
                        break;
                    }
                }
            }
            $this->assign('sub_menu', $sub_menu);
            $this->assign('menu_name', D('menu')->get_menu_name($this->menuid));
        }
        $this->assign('menuid', $this->menuid);
        $this->assign('left_menu',$this->left());
        $my_admin = array('username'=>$_SESSION['admin']['username'],'rolename'=>'超级管理员');
        $this->assign('my_admin', $my_admin);
    }

       /**
     * 上传文件
     */
    protected function _upload($file, $dir = '', $thumb = array(), $save_rule='uniqid',$userdir='') {
        $upload = new UploadFile();
        if ($dir&&!$userdir) {
            $upload_path = C('zyb_attach_path') . $dir . '/';
            $upload->savePath = $upload_path;

        }
        if($userdir){
        	 $upload->savePath=$userdir;
        }

        if ($thumb) {
            $upload->thumb = true;
            $upload->thumbMaxWidth = $thumb['width'];
            $upload->thumbMaxHeight = $thumb['height'];
            $upload->thumbPrefix = '';
            $upload->thumbSuffix = isset($thumb['suffix']) ? $thumb['suffix'] : '_thumb';
            $upload->thumbExt = isset($thumb['ext']) ? $thumb['ext'] : '';
            $upload->thumbRemoveOrigin = isset($thumb['remove_origin']) ? true : false;
        }

        //自定义上传规则

		$uploadf=$this->_upload_init($upload);

        if( $save_rule!='uniqid' ){
            $upload->saveRule = $save_rule;
        }

        if ($result = $upload->uploadOne($file)) {
            return array('error'=>0, 'info'=>$result);
        } else {
            return array('error'=>1, 'info'=>$upload->getErrorMsg());
        }
    }
	protected function _upload_init($upload) {
        $allow_max = C('zyb_attr_allow_size'); //读取配置
        $allow_exts = explode(',', C('zyb_attr_allow_exts')); //读取配置
        $allow_max && $upload->maxSize = $allow_max * 1024;   //文件大小限制
        $allow_exts && $upload->allowExts = $allow_exts;  //文件类型限制
        $upload->saveRule = 'uniqid';
        $upload->thumbComperssion = 85;//缩略图质量默认为85
	}

      /**
     * 列表页面
     */
    public function index() {
        $map = $this->_search();
        $mod = D($this->_name);
        !empty($mod) && $this->_list($mod, $map);
        $this->display();
    }


    /**
     * 添加
     */
    public function add() {
        $mod = D($this->_name);
        if (IS_POST) {
            if (false === $data = $mod->create()) {
                IS_AJAX && $this->ajaxReturn(0, $mod->getError());
                $this->error($mod->getError());
            }
            if (method_exists($this, '_before_insert')) {
                $data = $this->_before_insert($data);
            }
            if( $mod->add($data) ){
                if( method_exists($this, '_after_insert')){
                    $id = $mod->getLastInsID();
                    $this->_after_insert($id);
                }
                $id = $mod->getLastInsID();
                if(method_exists($this,'_end_data')){
                    $this->_end_data($data);
                }

            	//单图片上传处理
				$this->_end_dataimg($id);
				//多图片处理
                $imglist=$this->_end_add_img($id);
                IS_AJAX && $this->ajaxReturn(1,'操作成功', '', 'add');
                $this->success('操作成功',U($this->_name.'/index',array('menuid'=>$_GET['menuid'],'menupid'=>$_GET['menupid'],'class_id'=>$_GET['class_id'],'class_list_id'=>$_GET['class_list_id'])));
            } else {
                dump($mod);die;
                IS_AJAX && $this->ajaxReturn(0,'操作失败');
                $this->error('操作失败');
            }
        } else {
            if (IS_AJAX) {
                $response = $this->fetch();
                $this->ajaxReturn(1, '', $response);
            } else {
                $this->display();
            }
        }
    }


    /**
     * 修改
     */
    public function edit()
    {
        $mod = D($this->_name);
        $pk = $mod->getPk();
        if (IS_POST) {

            if (false === $data = $mod->create()) {
                IS_AJAX && $this->ajaxReturn(0, $mod->getError());
                $this->error($mod->getError());
            }

            if (method_exists($this, '_before_update')) {
            	//更新之前操作文件状态
                $data = $this->_before_update($data);
            }
			//单图片上传处理
			$this->_before_updateimg($data['id']);
            //多图片上传处理
			$this->_before_add_img($data['id']);
            if (false !== $mod->save($data)) {
                if( method_exists($this, '_after_update')){
                    $this->_after_update($data['id']);
                }
                IS_AJAX && $this->ajaxReturn(1,'操作成功', '', 'edit');
                $this->success('操作成功',U($this->_name.'/index',array('menuid'=>$_GET['menuid'],'menupid'=>$_GET['menupid'],'class_id'=>$_GET['class_id'],'class_list_id'=>$_GET['class_list_id'])));
            } else {
                IS_AJAX && $this->ajaxReturn(0,'操作失败');
                $this->error('操作失败');
            }
        } else {
            $id = $this->_get($pk, 'intval');
            $info = $mod->find($id);
            $this->assign('info', $info);
             if (IS_AJAX) {
                $response = $this->fetch();
                $this->ajaxReturn(1, '', $response);
            } else {
                $this->display('add');
            }
        }
    }

    /**
     * ajax修改单个字段值
     */
    public function ajax_edit()
    {
        //AJAX修改数据
        $mod = D($this->_name);
        $pk = $mod->getPk();
        $id = $this->_get($pk, 'intval');
        $field = $this->_get('field', 'trim');
        $val = $this->_get('val', 'trim');
        //允许异步修改的字段列表  放模型里面去 TODO
        if($field=='start_time'||$field=='end_time'){
            $val=strtotime($val);
        }
		//判断这个修改的字段是否唯一
		$_validate = $mod->_validate;
		if($_validate){
			foreach($_validate as $k=>$v){
				//找出有没有设定 唯一
				if($v[4]=='unique' and $field == $v[0]){
					//说明要修改的字段 是属于 唯一值的
					$map[$field] = $val;
					if($mod->where($map)->find())
						$this->ajaxReturn(0,$v[2]);
				}
			}
		}
		
        $mod->where(array($pk=>$id))->setField($field, $val);
        $this->ajaxReturn(1);
    }

    /**
     * 删除
     */
    public function delete()
    {
        $mod = D($this->_name);
        $pk = $mod->getPk();
        $ids = trim($this->_request($pk), ',');
        if ($ids) {
            if (!method_exists($this, '_before_delete_img')) {
            	//多图片上传处理
	    		$this->_before_more_deleteimg();
				//单图片上传处理
	    		$this->_before_deleteimg();
            }else{
				$this->_before_delete_img();
            }
            if (false !== $mod->delete($ids)) {
                IS_AJAX && $this->ajaxReturn(1,'操作成功');
                $this->success('操作成功',U($this->_name.'/index',array('menuid'=>$_GET['menuid'],'menupid'=>$_GET['menupid'],'class_id'=>$_GET['class_id'],'class_list_id'=>$_GET['class_list_id'])));
            } else {
                IS_AJAX && $this->ajaxReturn(0,'操作失败');
                $this->error('操作失败');
            }
        } else {
            IS_AJAX && $this->ajaxReturn(0, '操作失败');
            $this->error('操作失败');
        }
    }




    /**
     * 获取请求参数生成条件数组
     */
    protected function _search() {
        //生成查询条件
        $mod = D($this->_name);
        $map = array();
        foreach ($mod->getDbFields() as $key => $val) {
            if (substr($key, 0, 1) == '_') {
                continue;
            }
            if ($this->_request($val)) {
                $map[$val] = $this->_request($val);
            }
        }
        return $map;
    }
    public function check_priv() {
//
        if ((!isset($_SESSION['admin']) || !$_SESSION['admin']) && !in_array(ACTION_NAME, array('login','verify_code'))  ) {
            //跳到后台入口,普通防护地址
            $this->waitSecond=5; //退出进间为5秒
            //if(IS_AJAX){$this->ajaxReturn(0,'很抱歉,由于您长时间不响应,会话已失效,请重新登录！！');}
            //$this->error('很抱歉,由于您长时间不响应,会话已失效,请重新登录！！',C('zyb_site_url'));
			//生成验证
			$time=time();
			$vcode=md5(md5($data['Admin_Enter_Md5']).$time);
			/* 跳转到后台 */
			header("Location: index.php?g=admin&m=index&a=login&vcode=".$vcode."&btime=".$time);
			exit();
		}
        if($_SESSION['admin']['role_id'] == 1||in_array(ACTION_NAME, array('login','verify_code'))) {
            return true;
        }
        if($_SESSION['admin']&&in_array(ACTION_NAME, array('index','logout'))){return true;}
        if(MODULE_NAME=='admin'&&ACTION_NAME=='edits'){
        	return true;
        }
        $menu_mod = M('menu');
        $map=array('module_name'=>MODULE_NAME, 'action_name'=>ACTION_NAME);
        $menu = $menu_mod->where($map)->field('id')->find();
        $priv_mod = D('admin_auth');
        $r = $priv_mod->where(array('menu_id'=>$menu['id'], 'role_id'=>$_SESSION['admin']['role_id']))->count();
        if (!$r) {
        	if(IS_AJAX){
        		        $this->ajaxReturn(0,'系统启用权限控制,您当前角色拒绝访问该操作!');
        	}else{
                        $this->error('系统启用权限控制,您当前角色拒绝访问该操作!');
            }
       }
    }

    /**
     * 列表处理
     *
     * @param obj $model  实例化后的模型
     * @param array $map  条件数据
     * @param string $sort_by  排序字段
     * @param string $order_by  排序方法
     * @param string $field_list 显示字段
     * @param intval $pagesize 每页数据行数
     */
    protected function _list($model, $map = array(), $sort_by='', $order_by='', $field_list='*', $pagesize=20)
    {
        //排序
        $mod_pk = $model->getPk();
        if ($this->_request("sort", 'trim')) {
            $sort = $this->_request("sort", 'trim');
        } else if (!empty($sort_by)) {
            $sort = $sort_by;
        } else if ($this->sort) {
            $sort = $this->sort;
        } else {
            $sort = $mod_pk;
        }
        if ($this->_request("order", 'trim')) {
            $order = $this->_request("order", 'trim');
        } else if (!empty($order_by)) {
            $order = $order_by;
        } else if ($this->order) {
            $order = $this->order;
        } else {
            $order = 'DESC';
        }
        //如果需要分页
        if ($pagesize) {
            $count = $model->where($map)->count($mod_pk);
            $pager = new Page($count, $pagesize);
        }
        $select = $model->field($field_list)->where($map)->order($sort . ' ' . $order);
        $this->list_relation && $select->relation(true);
        if ($pagesize) {
            $select->limit($pager->firstRow.','.$pager->listRows);
            $page = $pager->show();
            $this->assign("page", $page);
        }
        $list = $select->select();
        $this->assign('list', $list);
        $this->assign('list_table', true);
    }

   /*==============================处理图片状态    单图添加==================================*/

    /**
     * 添加数据后修改图片状态
     *@param int $id 添加数据后生成的id
     * @param string  $module  图片上传对应的模块
     * @param string  $img  保存图片对应字段
     * @param array   $data  操作的数据
     */
    public function _end_dataimg($id){
    	$data=$_POST;
    	$img_name=$this->_request('up_img_name');
    	//默认图片为img
    	!$img_name&&$img_name[0]='img';
    	$module=$this->_name;
    	foreach($img_name as $k=>$v){
    		  //每次循环重置初始化
    		  $img=$dt='';
    		  $img=$v;
    		  if($data[$img]){
				  $odt=M("attachment")->where(array('filepath'=>$data[$img]))->getField('setmod');
				  $setmod=$module.$img.'_'.$id.',';
				  $odt&&$setmod=$odt.$setmod;
			   	  M("attachment")->where(array('filepath'=>$data[$img]))->save(array('status'=>1,'setmod'=>$setmod));
    		  }
    	}
    }

/*==============================处理图片状态    多图添加==================================*/

    /*** @todo 插入数据之后  插入多图表
     * 该关联图片表为默认的 如结构不同 重写该模块即可
     * * */
    public function _end_add_img($id,$img_name){
    	$data=$_POST;
    	//上传的图片是否为数组
    	!$img_name&&$img_name='imglist';
    	$module=$this->_name;
    	$imglist=$data[$img_name];
    	$ordids=$data['ordid'];
    	 if(count($imglist)>=1){
            $j=0;
            foreach($imglist as $k=>$v){
              //没有值跳过本次循环
               if(!$v)continue;
               $attr_data[$j][$img_name]=$v;
               $attr_data[$j]['tid']=$id;
               $attr_data[$j]['ordid']=$ordids[$k]?$ordids[$k]:1;
               $attr_data[$j]['id']=M($module.'_img')->add($attr_data[$j]);
               $j++;
            }
    	 }
    	 //修改   多图片状态
    	 if(count($attr_data)>=1){
    	 	$this->_end_more_dataimg($id,$img_name,$attr_data);
    	 }
    }
    /**
     * 添加数据后修改   多图片状态
     *@param $id 添加数据后生成的id
     *@param $name 提交图片字段
     */
    public function _end_more_dataimg($id,$img_name,$attr_data){
    	$imglist=$attr_data;
    	$module=$this->_name;
		if(is_array($imglist)){
			//默认数组上传的图片 字段为img
			foreach($imglist as $k=>$v){
    		  if($v){
				  $odt=M("attachment")->where(array('filepath'=>$v[$img_name]))->getField('setmod');
				  $setmod=$module.'_m_'.$v['id'].',';
				  $odt&&$setmod=$odt.$setmod;
			   	  M("attachment")->where(array('filepath'=>$v[$img_name]))->save(array('status'=>1,'setmod'=>$setmod));
    		  }
			}
		}
    }


   /*==============================处理图片状态    单图编辑==================================*/



    /**
     * 更新数据后修改图片状态
     *
     * @param string  $module  图片上传对应的模块
     * @param string  $img  保存图片对应字段
     * @param array   $data  操作的数据
     */
    public function _before_updateimg($id){
    	$img_name=$this->_request('up_img_name');
    	//默认图片为img
    	!$img_name&&$img_name[0]='img';
    	$module=$this->_name;

    	foreach($img_name as $k=>$v){
    		//每次循环重置初始化
    		$img=$oimg=$dt='';
    		$data=$_POST;
    		$sdata=array();
    		$img=$v;
    		//上传的图片是否为数组
			$oimg=D($module)->where(array('id'=>$id))->getField($img);
			if($module=='setting'){
				//站点设置 图片编辑
				$oimg=D($module)->where(array('name'=>$img))->getField('data');
				$data=$_REQUEST['setting'];
			}
	    	if($oimg!=$data[$img]&&is_file($this->img_save_path.$data[$img])){
	    	  	  if(is_file($this->img_save_path.$oimg)){
		    	  	  $dt= M("attachment")->where(array('filepath'=>$oimg))->getField('setmod');
		    	  	  $dt&&$setmod=str_replace($module.$img.'_'.$id.',','',$dt);
		    	  	  $sdata['setmod']=$setmod;
		    	  	  $setmod==''&&$sdata['status']=0;
		    	  	  M("attachment")->where(array('filepath'=>$oimg))->save($sdata);
	    	  	  }
				  $odt=M("attachment")->where(array('filepath'=>$data[$img]))->getField('setmod');
				  $setmod=$module.$img.'_'.$data['id'].',';
	        	  $odt&&$setmod=$odt.$setmod;
			   	  M("attachment")->where(array('filepath'=>$data[$img]))->save(array('status'=>1,'setmod'=>$setmod));
	    	}

		}
    }
   /*==============================处理图片状态    多图编辑==================================*/
    /*** @todo 编辑数据之前
     * 该关联图片表为默认的 如结构不同 重写该模块即可
     * * */
    protected function _before_add_img($id,$img_name) {
    	$data=$_POST;
    	//上传的图片是否为数组
    	!$img_name&&$img_name='imglist';
    	$module=$this->_name;
    	$img_module=M($module.'_img');
    	$imglist=$data[$img_name];

    	$ordids=$data['ordid'];
    	 if(count($imglist)>=1){
             foreach($imglist as $k=>$v){
              //没有值跳过本次循环
               if(!$v)continue;
               $attr_data[$k][$img_name]=$v;
               $attr_data[$k]['tid']=$id;
			   $attr_data[$k]['ordid']=$ordids[$k]?$ordids[$k]:1;
               //查找是旧图 还是新更新的图片
               if(count(explode('tid_',$k))>1){
	    			//查找出图片表 对应图片的id
	    			$imgid=explode('tid_',$k);
	    			//查找旧图片 为更改旧图片状态铺前奏
	    			$oldimg[$k]=$img_module->where(array('tid'=>$id,'id'=>$imgid[1]))->getField($img_name);
			    	if(count($oldimg[$k])>0){
						$img_module->where(array('tid'=>$id,'id'=>$imgid[1]))->save($attr_data[$k]);
						$attr_data[$k]['id']=$imgid[1];
			    	}
			    	//查找旧图片 为更改旧图片状态铺前奏
			    	$oldimg[$k]&&$attr_data[$k]['oldimglist']=$oldimg[$k];
    			}else{
    				//增加新图
    				$attr_data[$k]['id']=M($module.'_img')->add($attr_data[$k]);
    			}
            }
    	 }
    	 //修改   多图片状态
    	 if(count($attr_data)>=1){
    	 	$this->_before_more_updateimg($id,$img_name,$attr_data);
    	 }
    }


	/*** 更新数据后修改  多图片状态
     * @param string  $module  图片上传对应的模块
     *@param $id 添加数据后生成的id
     *@param $name 提交图片字段
     *提示 如果imglist 用tid_id 组合的 则是原本有图片进行覆盖（则需要对旧图片进行处理)  否则是新上传的图片
     */
    public function _before_more_updateimg($id,$img_name,$attr_data){
    	$data=$_POST;
    	$module=$this->_name;
    	$imglist=$attr_data;
    	foreach($imglist as $k=>$v){
    		if($v['oldimglist']&&$v['oldimglist']!=$v[$img_name]){
    			  //查找出图片表 对应图片的id
    			  $imgid=explode('tid_',$k);
	    	  	  if(is_file($this->img_save_path.$v['oldimglist'])){
		    	  	  $dt= M("attachment")->where(array('filepath'=>$v['oldimglist']))->getField('setmod');
		    	  	  $dt&&$setmod=str_replace($module.'_m_'.$v['id'].',','',$dt);
		    	  	  $sdata['setmod']=$setmod;
		    	  	  $setmod==''&&$sdata['status']=0;
		    	  	  M("attachment")->where(array('filepath'=>$v['oldimglist']))->save($sdata);
	    	  	  }
    		}
    		//有图片 并且更新过的图片才需要修改状态
    		if($v['oldimglist']!=$v[$img_name]&&$v[$img_name]){
			  $odt=M("attachment")->where(array('filepath'=>$v[$img_name]))->getField('setmod');
			  $setmod=$module.'_m_'.$v['id'].',';
        	  $odt&&$setmod=$odt.$setmod;
		   	  M("attachment")->where(array('filepath'=>$v[$img_name]))->save(array('status'=>1,'setmod'=>$setmod));
    		}
    	}
    }


   /*==============================处理图片状态    删除单图==================================*/

    /**
     * 删除数据前修改图片状态
     *
     * @param string  $module  图片上传对应的模块
     * @param string  $img  保存图片对应字段
     */
    public function _before_deleteimg($img_name){
    			//默认图片为img
    			!$img_name&&$img_name[0]='img';
    	        $ids = trim($this->_request('id'), ',');
                if(count($r=explode(',',$ids))>=1){
                	foreach($r as $id){
				    	$module=$this->_name;
				    	foreach($img_name as $k=>$v){
				    		//每次循环重置初始化
				    		$img=$oimg=$dt='';
				    		$sdata=$temp=array();
				    		$img=$v;
					  		  $temp=D($module)->where(array('id'=>$id))->Field('id,'.$img)->find();
					  		  if($temp){
						  		  $oimg=$this->img_save_path.$temp[$img];
				    	  		  if(is_file($oimg)){
								  $dt=M("attachment")->where(array('filepath'=>$temp[$img]))->getField('setmod');
					    	  	  $dt&&$setmod=str_replace($module.$img.'_'.$id.',','',$dt);
					    	  	  $sdata['setmod']=$setmod;
					    	  	  $setmod==''&&$sdata['status']=0;
					    	  	  M("attachment")->where(array('filepath'=>$temp[$img]))->save($sdata);
					  		  	  }
				    		   }
	    	  	     		}
                	}
    			}
    }
   /*==============================处理图片状态    删除多图==================================*/
    /**
     * 删除数据前修改 多图片状态
     * @param string  $module  图片上传对应的模块
     * @param string  $img  保存图片对应字段
     */
    public function _before_more_deleteimg($img_name){
    			//上传的图片是否为数组
    			!$img_name&&$img_name='imglist';
    	        $ids = trim($this->_request('id'), ',');
                if(count($r=explode(',',$ids))>=1){
                	foreach($r as $id){
				    	$module=$this->_name;
				    	$imglist=array();
				    	//查找该记录所有关联图片
				    	$imglist=D($module.'_img')->where(array('tid'=>$id))->select();
				    	foreach($imglist as $k=>$v){
				    		$oimg='';
				    		$oimg=$this->img_save_path.$v[$img_name];
							if(is_file($oimg)){
								  $dt=M("attachment")->where(array('filepath'=>$v[$img_name]))->getField('setmod');
					    	  	  $dt&&$setmod=str_replace($module.'_m_'.$v['id'].',','',$dt);
					    	  	  $sdata['setmod']=$setmod;
					    	  	  $setmod==''&&$sdata['status']=0;
					    	  	  M("attachment")->where(array('filepath'=>$v[$img_name]))->save($sdata);
					    	  	  D($module.'_img')->where(array('tid'=>$id,'id'=>$v['id']))->delete();
				  		  	  }
				    	}
                	}
                }
    }
    
    //左侧菜单
    public function left() {
	  $left_menu = D('menu')->admin_menu(0);
      foreach ($left_menu as $key=>$val) {
                $left_menu[$key]['sub'] = D('menu')->admin_menu($val['id']);
                if($left_menu[$key]['sub']){
                	foreach($left_menu[$key]['sub'] as $k=>$v){
                		$left_menu[$key]['sub'][$k]['msub'] = D('menu')->admin_menu($v['id']);
                	}
                }
        }
        //dump($left_menu);
	   $this->assign('left_menu',$left_menu);
	   $data=$this->fetch('public:left');
       return  $data;
    }
}
